package Funcionalidad;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;
import java.net.*;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Posts {

    private static final String controlador = "com.mysql.jdbc.Driver";
    private static final String url = "jdbc:mysql://localhost/flog";
    private static final String usuario = "root";
    private static final String clave = "";


    static {
        try {
            Class.forName(controlador);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("Error creating driver" + " class. Cause: " + e);
        }
    }

    public static Post ResultSetToPost(ResultSet resultado) throws SQLException {
        return new Post(resultado.getInt("id_post"), resultado.getString("fecha"), resultado.getString("titulo"), resultado.getString("texto"));
    }
//Devuelve la lista de los post disponibles.

    public static List<Post> consultaPosts() throws Exception {

        Connection conexion = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, usuario, clave);
        List<Post> lista = new ArrayList<Post>();
        //solicitud/recepcion de peticiones
        Statement solicitud = (Statement) conexion.createStatement();
        ResultSet resultados = solicitud.executeQuery("SELECT * FROM post ORDER BY `id_post` desc");
        while (resultados.next()) {
            Post post = Posts.ResultSetToPost(resultados);
            lista.add(post);
        }
        resultados.close();
        solicitud.close();
        conexion.close();
        return lista;
    }
//devuelve el post que le pasamos por parametro

    public static List<Post> consultaPost(int id_post) throws Exception {

        Connection conexion = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, usuario, clave);
        List<Post> lista = new ArrayList<Post>();
        //solicitud/recepcion de peticiones
        Statement solicitud = (Statement) conexion.createStatement();
        ResultSet resultados = solicitud.executeQuery("SELECT * FROM post WHERE id_post=" + id_post);
        while (resultados.next()) {
            Post post = Posts.ResultSetToPost(resultados);
            lista.add(post);
        }
        resultados.close();
        solicitud.close();
        conexion.close();
        return lista;
    }
//devuelve la lista de post para la barra lateral.

    public static List<Post> generaArchivo() throws Exception {
        Connection conexion = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, usuario, clave);
        List<Post> lista = new ArrayList<Post>();
        //solicitud/recepcion de peticiones
        Statement solicitud = (Statement) conexion.createStatement();
        ResultSet resultados = solicitud.executeQuery("SELECT * FROM `post` ORDER BY `id_post` desc");
        while (resultados.next()) {
            Post post = Posts.ResultSetToPost(resultados);
            lista.add(post);
        }
        resultados.close();
        solicitud.close();
        conexion.close();
        return lista;
    }
//actualiza el post que se le pasa por parametro

    public static void updatePost(String titulo, String texto, int id_post) throws Exception {
        String tex = URLEncoder.encode(texto, "ISO-8859-1");
        String ti = URLEncoder.encode(titulo, "ISO-8859-1");
        Connection conexion = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, usuario, clave);
        //solicitud/recepcion de peticiones
        Statement solicitud = (Statement) conexion.createStatement();
        int s = solicitud.executeUpdate("UPDATE post SET titulo='" + ti + "' WHERE id_post=" + id_post);
        int r = solicitud.executeUpdate("UPDATE post SET texto='" + tex + "' WHERE id_post=" + id_post);
        solicitud.close();
        conexion.close();

    }
//se borra el post que le pasamos por parametro

    public static void deletePost(int id_post) throws Exception {
        Connection conexion = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, usuario, clave);
        //solicitud/recepcion de peticiones
        Statement solicitud = (Statement) conexion.createStatement();
        int m = solicitud.executeUpdate("Delete from post where id_post=" + id_post);
        int r = solicitud.executeUpdate("Delete from comentario_post where id_post=" + id_post);
        solicitud.close();
        conexion.close();

    }
//creamo un nuevo post con la fecha actual y los datos que le pasamos como parametro

    public static void insertPost(String titulo, String texto) throws Exception {
        String tex = URLEncoder.encode(texto, "ISO-8859-1");
        String ti = URLEncoder.encode(titulo, "ISO-8859-1");
        Connection conexion = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, usuario, clave);
        //solicitud/recepcion de peticiones
        Statement solicitud = (Statement) conexion.createStatement();
        //la sentencia está bien
        int s = solicitud.executeUpdate("INSERT INTO post (fecha,titulo,texto) values('" + Habituales.fechaActual() + "','" + ti + "','" + tex + "')");

        //solicitud/recepcion de peticiones
        ResultSet resultados = solicitud.executeQuery("SELECT * FROM `post` ORDER BY `id_post` desc");
        int cont = 0;
        while (resultados.next() && cont != 1) {
            Post post = Posts.ResultSetToPost(resultados);
            envioCorreoPost(post);
            cont++;
        }
        resultados.close();
        solicitud.close();
        conexion.close();

    }

    public static void envioCorreoPost(Post p) {
        List<Usuario> user = new ArrayList();
        try {
            user = Usuarios.consultaUsuarios();
        } catch (Exception ex) {
        }
        Iterator it = user.iterator();
        while (it.hasNext()) {
            Usuario usu = (Usuario) it.next();
            envioNueva(usu, p);
        }
    }

    public static void envioNueva(Usuario us, Post p) {
        Properties props = new Properties();
// Nombre del host de correo, es smtp.gmail.com
        props.setProperty("mail.smtp.host", "smtp.gmail.com");
// TLS si está disponible
        props.setProperty("mail.smtp.starttls.enable", "true");
// Puerto de gmail para envio de correos
        props.setProperty("mail.smtp.port", "587");
// Nombre del usuario
        props.setProperty("mail.smtp.user", "estilo.vida.flog@gmail.com");
// Si requiere o no usuario y password para conectarse.
        props.setProperty("mail.smtp.auth", "true");
//Con esto estamos en disposición de obtener nuestra instancia de Session.
        Session session = Session.getDefaultInstance(props);
        session.setDebug(true);
//Vamos ahora a construir un mensaje simple de texto. Para ellos instanciamos la clase MimeMessage y le ponemos varios datos.
//En el constructor debemos pasarle el objeto Session que obtuvimos anteriormente
        MimeMessage message = new MimeMessage(session);
        try {
// Quien envia el correo
            message.setFrom(new InternetAddress("estilo.vida.flog@gmail.com"));
// A quien va dirigido
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(us.getEmail()));
//Ahora sólo queda llenar el asunto del mensaje y el texto. Como tenemos métodos para ello, setSubject() y setText(), no hay ningún problema.
            message.setSubject("Nuevo post creado en Flog");
            message.setText("Se le comunica de que ha sido creado un nuevo post" +
                    " con el titulo de " + URLDecoder.decode(p.getTitulo(), "ISO-8859-1") + "<br>" + "Puede consultarlo en Flog haciendo click " +
                    "<a href=http://localhost:8084/FLOG_jsp/Apariencia/VistaNuevoComentario.jsp?id=" + p.getId_post() + ">aquí</a>" + "<br>" +
                    "Fecha: " + p.getFecha(), "ISO-8859-1", "html");
//Enviamos el mensaje
            Transport t = session.getTransport("smtp");
//Ahora debemos establecer la conexión, dando el nombre de usuario y password.
            t.connect("estilo.vida.flog@gmail.com", "flog1234");
// ahora simplemente enviamos el mensaje
            t.sendMessage(message, message.getAllRecipients());
            t.close();
        } catch (Exception e) {
            System.out.println("Error al enviar el correo" + e);
        }
    }
}
